<?  
/*UNIT6 面向对象的PHP*/  
/*6.1理解面向对象的概念*/  
/*6.1.1类和对象*/  
//面向功能或者面向过程的软件被看作是过时的unfortunately，大部分的web脚本仍然是属于面向功能的。  
  
//面向对象的操作语言必须支持多态性——不同的类对同一个操作有不同的行为。  
  
//类的继承  
  
//几个名词：类，对象，超类，父类，子类，派生类  
  
  
  
  
  
/*6.2在php中创建类class*/  
class luclass{  
    public $attribute1;//public创建了属性,记得加$  
    public $attribute2;  
    }  
class luclass2{  
    function operation1(){}  
    function operation2($param1,$param2){}  
    //创建了一个类包含一个方法和一个有两个参数的方法  
  
    }  
  
  
  
  
  
/*6.2.2构造函数*/  
//创造一个我不知道什么意思的构造函数的类  
  
class luclass3{  
  
    function __construct($param){  
        echo "Constructor called with parameter".$param."\.<br />";  
        }  
    }  
//不知道这个怎么用比着葫芦画瓢吧  
  
  
  
  
  
/*6.2.3析构函数*/  
class luclass4{  
    function __destruct(){//析构函数括号中不含有任何参数，不包证这个语法是正确的。  
          
        }  
    }  
  
/*6.3类的实例化*/  
class luclass5{  
    function __construct($param){  
        echo "这个类将输出输入的字符：".$param."<br />";  
        }  
    }  
new luclass5("hello，world！");   
  
//截止到现在 我仍然不明白构造函数有什么用，类和函数有什么区别。。。  
  
//好像这个地方不用构造函数不行，不用构造函数打印不出来东西。不使用函数直接在类里面用echo 会报错。  
  
  
  
  
  
/*6.4使用类的属性 $this->*/  
  
class luclass6{  
    public $attribute;  
    function operation($param){  
        $this->attribute="这个luclass6类的attribute属性是".$param;  
        echo $this->attribute;  
        }  
    }  
//截止现在仍然不知道类里面的函数怎么调用  
  
  
  
class luclass7{  
    public $ism;  
    }  
$m=new luclass7();  
$m->ism="yes";  
echo $m->ism;  
//创建了一个luclass7类，定义了一个属性ism。然后创建了一个属于luclass7的对象m，将这个对象的ism属性设置为yes  
  
//但是php不建议使用这种方法。建议使用封装  
  
class luclass8{  
  
    public $iss;  
    function __get($attribute){  
        return $this->$attribute;  
        }//返回调用的属性  
    function __set($attribute,$value){  
        $this->attribute=$value;   
        }  
    }  
//日了狗了，这段函数也没什么用，说是最初设置的时候的可能这样设置的,跟luclass7一模一样的。  
  
$s=new luclass8();  
  
$s->iss="yes";  
echo $s->iss;  
  
class luteacher{  
    public $sex;  
    public $height;  
    public $name;  
    function __set($attribute,$value){  
        if($attribute=="sex" and $value=="男"||$value=="女"){  
            $this->sex=$value;  
            }  
        if($attribute=="height" and $value<=300||$value>=40){  
            $this->height=$value;  
            }  
        }  
      
    }  
  
$lvnan=new luteacher();  
$lvnan->name="吕楠";  
$lvnan->sex="女";  
$lvnan->height="160";  
echo "这个老师就是".$lvnan->name."，性别".$lvnan->sex."，身高".$lvnan->height."厘米，学生们都很喜欢她。<br />";  
  
  
/*6.5使用private and public 访问修饰符关键字控制访问*/  
//访问修饰符：public（默认），private，和protected（介于他俩之间）  
class luclass9{  
    public $sex;  
    public function __set($name,$value){  
        if($name=="sex"){  
            $this->sex=$value;  
            }     
        }  
    public function aaaaa(){  
        echo "这是class9类里面的一个动作。";  
        }     
    }  
  
$a=new luclass9();  
$a->sex="女";  
echo $a->sex."<br />";  
$a->aaaaa();  
  
//上面这个就是类 操作的调用。  
  
  
/*6.7在php中实现继承*/  
class luteacher_cd extends luteacher{  
    public $quyu;  
    public $fangjia;  
    function fenxi(){  
        if ($this->quyu=="天府新区"){  
            $this->fangjia=12000;  
            echo "该老师所在区域房价".$this->fangjia."元。";   
            }else{  
                echo "该老师还未购房！";  
                }  
        }  
    }  
$b=new luteacher_cd();   
$b->name="路昊";  
$b->quyu="天府新区";  
$c=new luteacher_cd();  
$c->name="文博";  
$b->fenxi();  
$c->fenxi();  
//$a->fenxi();//a不属于luteacher_cd  
  
  
/*6.7.1通过继承使用private、public和protected访问修饰控制符*/  
class luclassA{  
    public function lupublic(){echo "public extends luclassA.<br />";}  
    private function luprivate(){echo "private extends luclassA.<br />";}  
    protected function luprotected(){echo "protected extends luclassA.<br />";}  
    }  
class luclassB extends luclassA{  
    public $a;  
    public function extendss(){  
            $this->luprotected();  
            //return parent::luprivate();//不能通过parent：：来调用已经被private的操作  
        }  
    }  
  
$lua=new luclassA();  
$lua->lupublic();  
$lub=new luclassB;  
//$lub->lupublic();  
$lub->extendss();  
  
/*6.7.2重载*/  
class luA{  
    public $a="1",$b="2",$c="3";  
    function d(){  
        echo "it's default.";  
        }  
    }  
$v1=new luA;  
echo "<br />".$v1->a.$v1->b.$v1->c."<br />";  
class luB extends luA{  
    public $b="b";  
    function d(){  
        echo "it's diffrent.";  
        }  
    function e(){  
        $this->d();  
        parent ::d();  
        //return parent ::$b;//此处报错，因为parent只可以用于操作不能用于变量。  
        }     
    }  
$v2=new luB;  
echo "<br />".$v2->a.$v2->b.$v2->c."<br />";  
//子类将继承超类所有属性和操作，但是如果子类提供了替代定义，那么替代定义优先。  
echo $v2->e();  
  
  
/*学习中发现一个奇怪的例子*/  
//可以通过parent ：：参数传递的方法，调用的父类的private属性的东西  
class luuA{  
    private $a="a";  
    private $b="b";  
    public $d="d";  
    protected $e="e";  
    public function c(){  
        $a=$this->a."x";//此处$a和$this->a不是一个东西哦  
        echo $this->a.$this->d.$this->e.$a;  
        }//我认为是这样的：在类里面如果使用了$this->a的a是一个private属性，那么$this->不因a被重写替代定而改变。就算是再把a变成pulic也不行。public和protercted就没事。  
    }  
class luuB extends luuA{  
    public $a="aa";  
    public $d="dd";  
    protected $e="ee";  
    public function f(){  
        echo $this->a;  
        }  
    }  
  
$z=new luuA;  
echo $z->c()."<br />";  
$x=new luuB;  
echo $x->c();//虽然private $a被重写替代了，但是遇到this->了……  
$x->f();  
  
//privite 就像是一个锁住的属性。不让更改。  
//如果想要把父类private属性的值用到子类上，需要使用$this->，但是估计这个没什么用。  

/*插播一条代码打印前一天的时间*/
echo date("Y-m-d H:i:s",strtotime('-1 day',time()));


/*6.7.3使用final关键字来禁止继承和重载*/
//final只能修饰方法和类不能修饰属性，被修饰的方法不能在子类中覆盖到。lets try it。

final class luclass11{
	public $a="deafult";
	}
//class luclass12 extends luclass11{}//尝试继承会出现致命错误
class luclass13{
	protected $a="deafult";
	}
class luclass14 extends luclass13{
	final public function a(){//加上了final关键词仍然可以运行
		echo $this->a;
		}
	}
$c1=new luclass14;
$c1->a();
//private protected 不太一样
class luclass15 extends luclass14{
	
	}
$c2=new luclass15;
$c2->a();
//方法a（）仍然可以被继承
class luclass16 extends luclass14{
	public function b(){
		$this->a();
		}	
	}
$c3=new luclass16;
$c3->b();
//方法a()仍然可以被调用
class luclass17 extends luclass14{
//	public function a(){//当方法a（）被重载替换时报错
//		echo "im new a.";
//		}
	}

/*6.7.4PHP不支持多重继承*/
//对于已经继承了luclass14的luclass17,尝试让他再继承luclass13
//class luclass17 extends luclass13{}//此处报错Cannot redeclare class luclass17
interface jk1{
	function c();
	}

class jkclass1 implements jk1{
	public function a(){
		echo "a";		}
	public function c(){
		echo "c";		}
	}
	
$jk=new jkclass1;
$jk->a(); 
//这个例子没什么用，现在不懂接口有什么用



/*6.8类的设计*/
//（简化简单简洁）

/*6.9编写类代码*/
class testpage{
	public $content;
	public $title="这是一个页面的标题";
	public $keywords="关键词1，关键词2";
	public $button=array("home"=>"home.php",
						 "contact"=>"contact.php",
						 "servrices"=>"services.php",
						 "sitemap"=>"sitmap.php"
	);
	public function display(){
		echo "<html>\n<head>\n";
		$this->displaytitle();
		$this->displaykeywords();
		$this->displaystyles();
		echo "</head>\n</body>\n";
		$this->displayheader();
		$this->displaymenu($this->button);
		$this->content;
		$this->displayfooter();
		echo "</body>\n</html>";
		}
	}
/*__________以上代码是为了练手的 没有什么用处_____________*/



/*程序清单6-1*/
echo <<<AAA
<a href="page.inc">这是一个用灵活的方法来建立页面的方法</a>
<a href="home.php">这个是测试页面</a>
AAA;
//$fp=fopen("page.inc","w");//省事儿的建立一个文件的方法（没什么用记得注视掉）
//fclose($fp);//没什么用
//readfile("page.inc");
if((strpos($_SERVER['PHP_SELF'],"test/unit6.php"))==false){echo "jia";};
echo __FILE__;//在其它地方看到的好东西
//$fp=fopen("aboutme.php","w");//省事儿的建立一个文件的方法（没什么用记得注视掉）
//fclose($fp);//没什么用


//成功了用类建立页面 感觉很爽，自己给自己出题目尝试一下。
/*在文件夹news中，建立100个类似的页面，并且以时间命名，从当前时间向前推100天。明明格式为news20170920.php*/

/*先生成100个页面并且写入内容*/
/*把目录重置好*/
if(file_exists("news/newstitle.txt")){unlink("news/newstitle.txt");}
for($i=0;$i<100;$i++){
	$ei=$i-100;//提前的天数
	$newsdate=date("Ymd",strtotime("$ei day",time()));
	$fp=fopen("news/".$newsdate.".php","w+");
	$str='<?
	require("newspage.inc");
	$newspage=new newspage();
	$newspage->content="Today is '.$newsdate.'.<br /></br />";
	$newspage->display();
	?>';
	flock($fp,LOCK_EX);
	fwrite($fp,$str);
	flock($fp,LOCK_UN);
	fclose($fp);
	/*写一个文件来储存他们的名字*/
	$fp=fopen("news/newstitle.txt","a+");
	flock($fp,LOCK_EX);
	fwrite($fp,$newsdate."\r\n");
	flock($fp,LOCK_UN);
	fclose($fp);
	echo "<br />".($i+1)." ".$newsdate.".php...成功!";

	}
echo $thisfile=$_SERVER['DOCUMENT_ROOT']."test/";

//在一个业务繁忙的网站中，处理速度是很重要的，应当尽可能使用静态html网页，或者尽可能缓存脚本
//输出，从而减少在服务器中的载入工作
/*--------end---------*/

echo "<a href=\"unit6-2.php\">点击进入第二个unit6页面</a>";

fopen("unit6-2.php","w");



  
?>